#include "MainWindow.h"

MainWindow::MainWindow(QWidget *parent): QDialog(parent)
{
    scene = new QGrapheScene();
    scene_view = new QGraphicsView(scene);

    vue_graphe = new QRadioButton("graphe") ;
    vue_sous_graphe = new QRadioButton ("sous graphe") ;
    vue_graphe->setChecked(true);

    combo_fonction = new QComboBox();
    combo_fonction->addItem("Initialisation",new QVariant(0));
    combo_fonction->addItem("Sequentielle",new QVariant(1));
    combo_fonction->addItem("Minimal",new QVariant(2));
    combo_fonction->addItem("Back Traking",new QVariant(3));


    pValider = new QPushButton("Valider");
    label_couleur1 = new QLabel("couleur 1");
    label_couleur2 = new QLabel("couleur 2");
    spin_couleur1 = new  QSpinBox();
    spin_couleur2 = new QSpinBox ();
    label_couleur1->setVisible(false);
    label_couleur2->setVisible(false);
    spin_couleur1->setVisible(false);
    spin_couleur2->setVisible(false);
    pValider->setVisible(false);


    pQuitter = new QPushButton("Quitter");
    pNouveau = new QPushButton("Nouveau");
    pColoration = new QPushButton("Coloration");


    cFonction = new QComboBox();
    bHLayout  = new QHBoxLayout();
    bVayout   = new QVBoxLayout();


    label_vue = new QLabel("vue");

    QVBoxLayout* box_V_Vue = new QVBoxLayout();
    box_V_Vue->addWidget(vue_graphe);
    box_V_Vue->addWidget(vue_sous_graphe);
    bHLayout->addWidget(label_vue);
    bHLayout->addLayout(box_V_Vue);

    bHLayout->addWidget(label_couleur1);
    bHLayout->addWidget(spin_couleur1);
    bHLayout->addWidget(label_couleur2);
    bHLayout->addWidget(spin_couleur2);
    bHLayout->addWidget(pValider);
    bHLayout->addStretch(200);
    bVayout->addLayout(bHLayout);

    bHLayout  = new QHBoxLayout();
    bHLayout->addWidget(pNouveau);
    bHLayout->addWidget(pColoration);
    bHLayout->addWidget(combo_fonction);
    bHLayout->addSpacing(300);
    bHLayout->addWidget(pQuitter);


    bVayout->addWidget(scene_view);
    bVayout->addLayout(bHLayout);

    this->setLayout(bVayout);

    connect(pQuitter, SIGNAL(clicked()),this,SLOT(close()));
    connect(pNouveau, SIGNAL(clicked()),this,SLOT(nouveau()));
    connect(pColoration,SIGNAL(clicked()),this,SLOT(coloration()));


    connect(vue_graphe, SIGNAL(clicked()),this,SLOT(affiche_graphe()));
    connect(vue_sous_graphe, SIGNAL(clicked()),this,SLOT(affiche_sous_graphe()));
    connect(pValider, SIGNAL(clicked()),this,SLOT(sous_graphe()));


}
MainWindow::~MainWindow(){}

void MainWindow::nouveau(){

    QCreerGraphe *g = new QCreerGraphe(this);
    vue_graphe->click();


}
void MainWindow::coloration(){

    Graphe * g = this->getGrapheScene()->getGraphe();

    QString str = combo_fonction->currentText();
    if (str == "Initialisation"){
       this->vue_graphe->click();
        g->initialisationCouleur(0);
    }
    else if (str == "Sequentielle"){
        this->vue_graphe->click();
        g->initialisationCouleur(0);
        g->coloration_sequentielle();
        if (g->grapheBienColore() == 1) cout<<"Le graph a ete colorier avec succes"<<endl;
        else cout<<"Erreur lors de la coloration"<<endl;

    }
    else if (str == "Minimal"){

        this->vue_graphe->click();
        g->initialisationCouleur(0);
        g->coloration_minimal();
        if (g->grapheBienColore()) cout<<"Le graph a ete colorier avec succes"<<endl;
        else cout<<"Erreur lors de la coloration"<<endl;

    }
    else if (str == "Back Traking"){
        this->vue_graphe->click();
        g->initialisationCouleur(0);
        g->coloration_back_track();
        if (g->grapheBienColore()) cout<<"Le graph a ete colorier avec succes"<<endl;
        else cout<<"Erreur lors de la coloration"<<endl;

    }


    getGrapheScene()->clearGraphe();
    getGrapheScene()->dessiner();

}
void MainWindow::sous_graphe(){
    this->getGrapheScene()->clearGraphe();
    this->getGrapheScene()->dessiner_sous_graphe(spin_couleur1->value(),spin_couleur2->value());
}
void MainWindow::affiche_sous_graphe(){
    label_couleur1->setVisible(true);
    label_couleur2->setVisible(true);
    spin_couleur1->setVisible(true);
    spin_couleur2->setVisible(true);
    pValider->setVisible(true);
    this->getGrapheScene()->clearGraphe();
    this->getGrapheScene()->dessiner_sous_graphe(spin_couleur1->value(),spin_couleur2->value());
}
void MainWindow::affiche_graphe(){
    label_couleur1->setVisible(false);
    label_couleur2->setVisible(false);
    spin_couleur1->setVisible(false);
    spin_couleur2->setVisible(false);
    pValider->setVisible(false);
    this->getGrapheScene()->clearGraphe();
    this->getGrapheScene()->dessiner();
}
QGrapheScene* MainWindow::getGrapheScene() {return scene;}
